home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 39 / Amiga Format CD39 (1999-04-13)(Future Publishing)(GB)[!][issue 1999-05].iso / -seriously_amiga- / wb / selector / tools / docs / execute.c < prev    next >
C/C++ Source or Header  |  1999-03-02  |  5KB  |  224 lines

  1. /*
  2. **    $VER: Execute.c 1.6 (20.05.97)
  3. **
  4. **    Execute enhancement
  5. **
  6. **    © Copyright 1996-1997 by Norbert Püschel
  7. **    All Rights Reserved
  8. */
  9.  
  10. #include <proto/exec.h>
  11. #include <proto/dos.h>
  12.  
  13. #include <string.h>
  14.  
  15. int ExecCommand(STRPTR command,ULONG stack,STRPTR argstr,
  16.                 struct ExecBase *SysBase,struct DosLibrary *DOSBase);
  17.  
  18. BPTR OpenScript(STRPTR script,struct DosLibrary *DOSBase);
  19.  
  20. #define BUFFLEN 384
  21.  
  22. int __saveds Start(void)
  23.  
  24. {
  25.   struct ExecBase *SysBase;
  26.   struct DosLibrary *DOSBase;
  27.  
  28.   struct RDArgs *args;
  29.   LONG argvals[2];
  30.   STRPTR filename;
  31.   BPTR file;
  32.  
  33.   UBYTE buff[BUFFLEN+1];
  34.   STRPTR command,argstr,s;
  35.   int cvslash;
  36.  
  37.   ULONG stack;
  38.   int retval = 20;
  39.  
  40.   SysBase = *(struct ExecBase **)4;
  41.  
  42.   if((DOSBase = (struct DosLibrary *)OpenLibrary("dos.library", 37))) {
  43.     retval = 10;
  44.  
  45.     args = ReadArgs("FILE/A,ARGUMENTS/F",argvals,0);
  46.     if(!args) {
  47.       PrintFault(IoErr(),"EXECUTE");
  48.     }
  49.     else {
  50.       filename = (STRPTR)(argvals[0]);
  51.  
  52.       if(file = OpenScript(filename,DOSBase)) {
  53.         if(!FGets(file,buff,BUFFLEN)) *buff = '\0';
  54.         Close(file);
  55.  
  56.         if(buff[0] == '#' && buff[1] == '!') {   /* #! style shell select */
  57.           for(argstr = buff+2;
  58.               *argstr == ' ' || *argstr == '\t';
  59.               argstr++);
  60.  
  61.           if(*argstr == '/') { /* UNIX style path name */
  62.             cvslash = 1;
  63.             argstr++;
  64.           }
  65.           else cvslash = 0;
  66.  
  67.           for(command = argstr;
  68.               *argstr && *argstr != ' ' && *argstr != '\t' && *argstr != '\n';
  69.               argstr++) {
  70.             if(cvslash && *argstr == '/') {
  71.               *argstr = ':';
  72.               cvslash = 0;
  73.             }
  74.           }
  75.           *(argstr++) = '\0';
  76.           while(*argstr == ' ' || *argstr == '\t') argstr++;
  77.           if(*argstr == '-') {
  78.             for(s = argstr;*s && *s != ' ' && *s != '\t' && *s != '\n';s++);
  79.             *(s++) = ' ';
  80.             strcpy(s,GetArgStr());
  81.           }
  82.           else {
  83.             argstr = GetArgStr();
  84.           }
  85.           stack = Cli()->cli_DefaultStack * sizeof(LONG);
  86.         }
  87.         else {
  88.           stack = 4096;
  89.  
  90.           if(buff[0] == '/' && buff[1] == '*') { /* AREXX */
  91.             command = "rx";
  92.           }
  93.           else {                                 /* normal script */
  94.             command = "Execute.orig";
  95.           }
  96.           argstr = GetArgStr();
  97.         }
  98.         retval = ExecCommand(command,stack,argstr,SysBase,DOSBase);
  99.       }
  100.       FreeArgs(args);
  101.     }
  102.     CloseLibrary((struct Library *)DOSBase);
  103.   }
  104.  
  105.   return(retval);
  106. }
  107.  
  108. const UBYTE version[] = "$VER: Execute 43.7 " __AMIGADATE__;
  109.  
  110. struct PathInfo {
  111.   BPTR nextPath;
  112.   BPTR pathLock;
  113. };
  114.  
  115. BPTR OpenScript(STRPTR script,struct DosLibrary *DOSBase)
  116.  
  117. {
  118.   BPTR fh,dir;
  119.   struct PathInfo *pi;
  120.  
  121.   fh = Open(script,MODE_OLDFILE);
  122.   if(fh == 0) {
  123.     for(pi = (struct PathInfo *)BADDR(Cli()->cli_CommandDir);
  124.         fh == 0 && pi;
  125.         pi = (struct PathInfo *)BADDR(pi->nextPath)) {
  126.       dir = CurrentDir(pi->pathLock);
  127.       fh = Open(script,MODE_OLDFILE);
  128.       CurrentDir(dir);
  129.     }
  130.     if(fh == 0) {
  131.       dir = Lock("C:",SHARED_LOCK);
  132.       if(dir) {
  133.         dir = CurrentDir(dir);
  134.         fh = Open(script,MODE_OLDFILE);
  135.         UnLock(CurrentDir(dir));
  136.       }
  137.     }
  138.   }
  139.   return(fh);
  140. }
  141.  
  142. #define NAMELEN 80
  143.  
  144. int ExecCommand(STRPTR command,ULONG stack,STRPTR argstr,
  145.                 struct ExecBase *SysBase,struct DosLibrary *DOSBase)
  146.  
  147. {
  148.   struct Segment *segment;
  149.   BPTR seglist = 0;
  150.   UBYTE name[NAMELEN+1];
  151.   int i;
  152.   BPTR dir;
  153.   struct PathInfo *pi;
  154.  
  155.   int retval = 10;
  156.  
  157.   Forbid();
  158.   segment = FindSegment(FilePart(command),0,0); /* check resident list */
  159.   if(segment) {
  160.     if(segment->seg_UC >= 0) {
  161.       segment->seg_UC++;
  162.       seglist = segment->seg_Seg;
  163.     }
  164.     else {
  165.       if(segment->seg_UC == -2) {
  166.         seglist = segment->seg_Seg;
  167.       }
  168.       else {
  169.         segment = 0;
  170.         seglist = 0;
  171.       }
  172.     }
  173.   }
  174.   Permit();
  175.  
  176.   if(seglist == 0) { /* load prog */
  177.     seglist = LoadSeg(FilePart(command));
  178.     if(seglist == 0) {
  179.       for(pi = (struct PathInfo *)BADDR(Cli()->cli_CommandDir);
  180.           seglist == 0 && pi;
  181.           pi = (struct PathInfo *)BADDR(pi->nextPath)) {
  182.         dir = CurrentDir(pi->pathLock);
  183.         seglist = LoadSeg(command);
  184.         CurrentDir(dir);
  185.       }
  186.       if(seglist == 0) {
  187.         dir = Lock("C:",SHARED_LOCK);
  188.         if(dir) {
  189.           dir = CurrentDir(dir);
  190.           seglist = LoadSeg(FilePart(command));
  191.           UnLock(CurrentDir(dir));
  192.         }
  193.       }
  194.     }
  195.   }
  196.  
  197.   if(seglist) {
  198.     for(i = 0;*command && i < NAMELEN;i++) {
  199.       name[i] = *(command++);
  200.     }
  201.     if(i < NAMELEN) name[i++] = ' ' ;
  202.     for(command = argstr;*command && *command != '\n' && i < NAMELEN;i++) {
  203.       name[i] = *(command++);
  204.     }
  205.     name[i] = '\0';
  206.     SetProgramName(name);
  207.     retval = RunCommand(seglist,stack,argstr,strlen(argstr));
  208.   }
  209.   else {
  210.     PrintFault(IoErr(),command);
  211.   }
  212.  
  213.   if(segment) {
  214.     Forbid();
  215.     if(segment->seg_UC > 0) segment->seg_UC--;
  216.     Permit();
  217.   }
  218.   else {
  219.     if(seglist) UnLoadSeg(seglist);
  220.   }
  221.  
  222.   return(retval);
  223. }
  224.